package com.jt.provider.controller;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;

@RefreshScope
@RestController
public class ProviderCacheController {
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/provider/cache01")
    public String doUseLocalCache01(){
        return "useLocalCache'value is   "+useLocalCache;
    }

    //1.设计一个cache,我们要将从数据库取到数据存储cache中,下次去从cache取
    //1)要保证数据的正确（线程安全）
    //2)要保证效率
    private List<String> cache = new CopyOnWriteArrayList<>();//乐观锁
//    private List<String> cache = new Vector<>();//悲观锁
    @RequestMapping("/provider/cache02")
    public List<String> doUseLocalCache02(){
        //1.配置中心useLocalCache值为false，则直接从数据库取
//        List<String> list = Arrays.asList("A", "B", "C");//假设这是从数据库取的数据
        if (!useLocalCache){
            System.out.println("本地缓存没有打开，查询数据库");
            return Arrays.asList("A", "B", "C");
        }
         if (cache.isEmpty()) {
             synchronized (this){
                 if (cache.isEmpty()){
                     System.out.println("本地缓存打开了，但是缓存没有数据，查数据库");
                     //查数据库（模拟）
                     List<String> list1 = Arrays.asList("A", "B", "C");
                     cache.addAll(list1);
                 }
             }
        }
        //2.配置中心useLocalCache值为true,则执行如下步骤
        //2.1.从cache取数据，假如有则直接返回
        //2.2.cache中没有数据则从数据库取数据，并将数据存储到cache中，然后返回数据
        return cache;
    }
}
